home *** CD-ROM | disk | FTP | other *** search
/ Aminet 24 / Aminet 24 (1998)(GTI - Schatztruhe)[!][Apr 1998].iso / Aminet / dev / c / AmiVoGL_MDEV.lha / drivers / hpdxy.c < prev    next >
C/C++ Source or Header  |  1994-04-15  |  7KB  |  440 lines

  1. #undef VOGLE
  2.  
  3. /*
  4.  *    DXY & HPGL Driver for vogle/vogl.
  5.  */
  6. #include <stdio.h>
  7. #ifdef VOGLE
  8. #include "vogle.h"
  9. #else
  10. #include "vogl.h"
  11. #endif
  12.  
  13. extern FILE    *_voutfile();
  14.  
  15. static int    plotlstx, plotlsty;    /* position of last draw */
  16.  
  17. static FILE    *fp;
  18.  
  19. #define    P_RESET        0
  20. #define    P_MOVE        1
  21. #define    P_DRAW        2
  22. #define    P_TXTSIZE    3
  23. #define    P_BEGTXT    4
  24. #define    P_ENDTXT    5
  25. #define    P_PEN        6
  26.  
  27. /*
  28.  * basic commands for hpgl
  29.  */
  30. /* 
  31.  * Changed to the delimiters to commas and removed spaces (for older plotter).
  32.  * (mike@penguin.gatech.edu) 
  33.  */
  34. static char    *hpgl[] = {
  35.     "DF;\n",
  36.     "PU%d,%d;\n",
  37.     "PD%d,%d;\n",
  38.     "SI%.4f,%.4f;\n",
  39.     "LB",
  40.     "\003\n",
  41.     "SP%d;\n"
  42. };
  43.  
  44. /*
  45.  * basic commands for dxy
  46.  */
  47. static char    *dxy[] = {
  48.     "",
  49.     "M %d,%d\n",
  50.     "D %d,%d\n",
  51.     "S %d\n",
  52.     "P",
  53.     "\n",
  54.     "J %d\n"
  55. };
  56.  
  57. static char    **plotcmds;
  58.  
  59. /*
  60.  * noop
  61.  *
  62.  *      do nothing but return-1
  63.  */
  64. static int noop(void)
  65. {
  66.     return(-1);
  67. }
  68. /*
  69.  * HPGL_common_init()
  70.  *
  71.  * Performs the common parts of HPGL initialization.
  72.  */
  73. static int HPGL_common_init(
  74.   int minx,
  75.   int maxx,
  76.   int miny,
  77.   int maxy)
  78. {
  79.     vdevice.depth = 4;
  80.  
  81.     fp = _voutfile();
  82.  
  83.     /*
  84.      * The next line is for serial lines if you need to set modes
  85.      */
  86.     fprintf(fp, "\033.(;\033.I81;;17;\033.N;19:IN;");
  87.  
  88.     /*
  89.      * Cause scaling to be 0 to maxX maxY.
  90.      */
  91.     fprintf(fp, "IP%d,%d,%d,%d;", minx, miny, maxx, maxy);
  92.     fprintf(fp, "SC0,%d,0,%d;", vdevice.sizeX, vdevice.sizeY);
  93.  
  94.     plotcmds = hpgl;
  95.     plotlstx = -1111111;
  96.     plotlsty = -1111111;
  97.  
  98.     return(1);
  99. }
  100.  
  101. /*
  102.  * HPGL_init
  103.  *
  104.  *    set up hp plotter. Returns 1 on success.
  105.  */
  106.  
  107. static int HPGL_A4_init(void)
  108. {
  109.     /*
  110.      * A4 paper
  111.      */
  112.     vdevice.sizeX = vdevice.sizeY = 7320;
  113.  
  114.     vdevice.sizeSx = 10200;
  115.     vdevice.sizeSy = 7320;
  116.  
  117.     /* 
  118.      * Changed to 7000 (from 7721) as noted by Michael J. Gourlay 
  119.      * (mike@penguin.gatech.edu) 
  120.      */
  121.     return(HPGL_common_init(-7000, 7000, -7000, 7000));
  122. }
  123.  
  124. static int HPGL_A3_init(void)
  125. {
  126.     /*
  127.      * A3 paper
  128.      */
  129.     vdevice.sizeX = vdevice.sizeY = 10560;
  130.  
  131.     vdevice.sizeSx = 14720; 
  132.     vdevice.sizeSy = 10560; 
  133.  
  134.     return(HPGL_common_init(-10000, 10000, -10000, 10000));
  135. }
  136.  
  137. static int HPGL_A2_init(void)
  138. {
  139.     /*
  140.      * A2 paper
  141.      */
  142.     vdevice.sizeX = vdevice.sizeY = 13440;
  143.  
  144.     vdevice.sizeSx = 18734;
  145.     vdevice.sizeSy = 13440;
  146.  
  147.     return(HPGL_common_init(-13000, 13000, -13000, 13000));
  148. }
  149.  
  150. static int HPGL_A1_init(void)
  151. {
  152.     /*
  153.      * A1 paper
  154.      */
  155.     vdevice.sizeX = vdevice.sizeY = 21360;
  156.  
  157.     vdevice.sizeSx = 29774;
  158.     vdevice.sizeSy = 21360;
  159.  
  160.     return(HPGL_common_init(-21000, 21000, -21000, 21000));
  161. }
  162.  
  163.  
  164. /*
  165.  * DXY_init
  166.  *
  167.  *    set up dxy plotter. Returns 1 on success.
  168.  */
  169. static int DXY_init(void)
  170. {
  171.     fp = _voutfile();
  172.  
  173.     vdevice.sizeX = vdevice.sizeY = 1920; 
  174.  
  175.     vdevice.sizeSx = 2668; 
  176.     vdevice.sizeSy = 1920; 
  177.  
  178.     plotcmds = dxy;
  179.     plotlstx = -1;
  180.     plotlsty = -1;
  181.  
  182.     fprintf(fp, plotcmds[P_RESET]);
  183.  
  184.     return(1);
  185. }
  186.  
  187. /*
  188.  * PLOT_draw
  189.  *
  190.  *    print the commands to draw a line from the current graphics position
  191.  * to (x, y).
  192.  */
  193. static PLOT_draw(
  194.   int x,
  195.   int y)
  196. {
  197.     if (plotlstx != vdevice.cpVx || plotlsty != vdevice.cpVy)
  198.         fprintf(fp, plotcmds[P_MOVE], vdevice.cpVx, vdevice.cpVy);
  199.  
  200.     fprintf(fp, plotcmds[P_DRAW], x, y);
  201.     plotlstx = x;
  202.     plotlsty = y;
  203. }
  204.  
  205. /*
  206.  * PLOT_exit
  207.  *
  208.  *    exit from vogle printing the command to put away the pen and flush
  209.  * the buffer.
  210.  */
  211. static PLOT_exit(void)
  212. {
  213.     fprintf(fp, plotcmds[P_PEN], 0);
  214.     fprintf(fp, "\033.)");
  215.     fflush(fp);
  216.  
  217.     if (fp != stdout)
  218.         fclose(fp);
  219. }
  220.  
  221. /*
  222.  * PLOT_color
  223.  *
  224.  *    change the current pen number.
  225.  */
  226. static PLOT_color(int i)
  227.     fprintf(fp, plotcmds[P_PEN], i);
  228. }
  229.  
  230. /*
  231.  * HPGL_font
  232.  *
  233.  *    load in large or small
  234.  */
  235. static int HPGL_font(char *font)
  236. {
  237.     if (strcmp(font, "small") == 0) {
  238.         vdevice.hwidth = 97.01;    /* Size in plotter resolution units */
  239.         vdevice.hheight = vdevice.hwidth * 2.0;
  240.         fprintf(fp, plotcmds[P_TXTSIZE], 0.16, 0.32);
  241.     } else if (strcmp(font, "large") == 0) {
  242.         vdevice.hwidth = 145.5;
  243.         vdevice.hheight = vdevice.hwidth * 2.0;
  244.         fprintf(fp, plotcmds[P_TXTSIZE], 0.24, 0.48);
  245.     } else 
  246.         return(0);
  247.  
  248.     return(1);
  249. }
  250.  
  251. /*
  252.  * DXY_font
  253.  *
  254.  *    load in large or small.
  255.  */
  256. static int DXY_font(char *font)
  257. {
  258.     if (strcmp(font, "small") == 0) {
  259.         vdevice.hwidth = 24.25;
  260.         vdevice.hheight = vdevice.hwidth * 2.0;
  261.         fprintf(fp, plotcmds[P_TXTSIZE], 3);
  262.     } else if (strcmp(font, "large") == 0) {
  263.         vdevice.hwidth = 36.375;
  264.         vdevice.hheight = vdevice.hwidth * 2.0;
  265.         fprintf(fp, plotcmds[P_TXTSIZE], 5);
  266.     } else 
  267.         return(0);
  268.  
  269.     return(1);
  270. }
  271.  
  272. /*
  273.  * PLOT_char
  274.  *
  275.  *    draw a character.
  276.  */
  277. static PLOT_char(char c)
  278. {
  279.     int    dy, dx;
  280.  
  281.     if (plotlstx != vdevice.cpVx || plotlsty != vdevice.cpVy)
  282.         fprintf(fp, plotcmds[P_MOVE], vdevice.cpVx, vdevice.cpVy);
  283.  
  284.     fprintf(fp, plotcmds[P_BEGTXT]);
  285.  
  286.     fprintf(fp, "%c", c);
  287.  
  288.     fprintf(fp, plotcmds[P_ENDTXT]);
  289.  
  290.     plotlstx = plotlsty = -1111111;
  291. }
  292.  
  293. /*
  294.  * PLOT_string
  295.  *
  296.  *    output a string.
  297.  */
  298. static PLOT_string(char *s)
  299. {
  300.     int        dy, dx;
  301.  
  302.     if (plotlstx != vdevice.cpVx || plotlsty != vdevice.cpVy)
  303.         fprintf(fp, plotcmds[P_MOVE], vdevice.cpVx, vdevice.cpVy);
  304.  
  305.     fprintf(fp, plotcmds[P_BEGTXT]);
  306.  
  307.     fputs(s, fp);
  308.  
  309.     fprintf(fp, plotcmds[P_ENDTXT]);
  310.  
  311.     plotlstx = plotlsty = -1111111;
  312. }
  313.  
  314. /*
  315.  * PLOT_fill
  316.  *
  317.  *      "fill" a polygon
  318.  */
  319. static PLOT_fill(
  320.   int n,
  321.   int x[],
  322.   int y[])
  323. {
  324.     int     i;
  325.  
  326.     if (plotlstx != x[0] || plotlsty != y[0])
  327.         fprintf(fp, plotcmds[P_MOVE], x[0], y[0]);
  328.  
  329.     for (i = 1; i < n; i++)
  330.         fprintf(fp, plotcmds[P_DRAW], x[i], y[i]);
  331.  
  332.     fprintf(fp, plotcmds[P_DRAW], x[0], y[0]);
  333.  
  334.     plotlstx = vdevice.cpVx = x[n - 1];
  335.     plotlsty = vdevice.cpVy = y[n - 1];
  336. }
  337.  
  338. static DevEntry hpgldev = {
  339.     "hpgl",
  340.     "large",
  341.     "small",
  342.     noop,
  343.     PLOT_char,
  344.     noop,
  345.     noop,
  346.     PLOT_color,
  347.     PLOT_draw,
  348.     PLOT_exit,
  349.     PLOT_fill,
  350.     HPGL_font,
  351.     noop,
  352.     noop,
  353.     HPGL_A2_init,
  354.     noop,
  355.     noop,
  356. #ifndef VOGLE
  357.     noop,
  358.     noop,
  359. #endif
  360.     PLOT_string,
  361.     noop,
  362.     noop
  363. };
  364.  
  365. /*
  366.  * _HPGL_devcpy
  367.  *
  368.  *    copy the HPGL device into vdevice.dev.
  369.  */
  370. int _HPGL_A2_devcpy(void)
  371. {
  372. /* if you don't have structure assignment ...
  373.     char    *dev, *tdev, *edev;
  374.  
  375.     dev = (char *)&hpgldev;
  376.     tdev = (char *)&vdevice.dev;
  377.     edev = dev + sizeof(Device);
  378.  
  379.     while (dev != edev)
  380.         *tdev++ = *dev++;
  381. */
  382.     vdevice.dev = hpgldev;
  383. }
  384.  
  385. int _HPGL_A3_devcpy(void)
  386. {
  387.     vdevice.dev = hpgldev;
  388.     vdevice.dev.Vinit = HPGL_A3_init;
  389. }
  390.  
  391. int _HPGL_A4_devcpy(void)
  392. {
  393.     vdevice.dev = hpgldev;
  394.     vdevice.dev.Vinit = HPGL_A4_init;
  395. }
  396.  
  397. int _HPGL_A1_devcpy(void)
  398. {
  399.     vdevice.dev = hpgldev;
  400.     vdevice.dev.Vinit = HPGL_A1_init;
  401. }
  402.  
  403. static DevEntry dxydev = {
  404.     "dxy",
  405.     "large",
  406.     "small",
  407.     noop,
  408.     PLOT_char,
  409.     noop,
  410.     noop,
  411.     PLOT_color,
  412.     PLOT_draw,
  413.     PLOT_exit,
  414.     PLOT_fill,
  415.     DXY_font,
  416.     noop,
  417.     noop,
  418.     DXY_init,
  419.     noop,
  420.     noop,
  421. #ifndef VOGLE
  422.     noop,
  423.     noop,
  424. #endif
  425.     PLOT_string,
  426.     noop,
  427.     noop
  428. };
  429.  
  430. /*
  431.  * _DXY_devcpy
  432.  *
  433.  *    copy the DXY device into vdevice.dev.
  434.  */
  435. int _DXY_devcpy(void)
  436. {
  437.     vdevice.dev = dxydev;
  438. }
  439.